Introduction to Deep Learning week 2
第二周的内容介绍了多层感知机(MLP),反向传播以及TensorFlow的基本使用,这里主要回顾多层感知机(MLP)和反向传播的内容。
先来看最简单的神经网络,多层感知机(MLP)
The simplest neural network: MLP
MLP
考虑如下问题:
我们的目标是区分出标记为$+,-$的点,之前的分类模型对应二维平面一条直线,这张图显然是无法用一条直线来分类,但是我们可以画出多条直线,如下所示:
其中$\sigma(x) =\frac{1}{1+e^{-z}}$。现在我们可以利用得到的$(z_1,z_2,z_3)$再进行分类,画图之后可以发现,这样就可以分类了,把上述过程的计算式写出来:
上述过程可以用计算图表示出来:
我们的计算图被称为多层感知机(Multi-layer perceptron,MLP),图中的$x_i$被称为输入层,$z_i$被称为隐藏层,$a$被称为输出层,每个节点是一个神经元,采取的操作都是先对输入进行线性组合,再由激活函数(例如$\sigma(x)$)计算出结果,注意激活函数一般来说不是线性的,否则上述模型相当于普通的感知机。
总结:
现在我们有了模型,接下来的问题是如何计算导数来用梯度下降法进行训练。
Chain rule
我们来看一个计算导数的例子:
利用链式法则,不难得出导数的计算公式,我们查看计算图,不难发现导数的每一项对应了计算图的一条路径,所以可以得到上图中的计算法则,接下来的目标是如何快速计算出这些结果。
back-propagation
来看一个复杂一点的例子:
上述计算式看似很复杂,但是观察后不难发现第2步的式子可以直接带入第三步的计算结果,带入后第三步可以化为如下形式:
所以我们可以利用后一层的导数计算这一层的导数,这个过程就叫做反向传播(back-propagation)。
Matrix derivatives
我们接下来的任务是用矩阵来计算上述导数。
Efficient MLP implementation
我们考虑三个输入,两个神经元,没有偏置项并且激活函数为线性函数的神经网络,计算式如下:
把它的计算过程写成矩阵的形式:
反向传播的时候我们要计算$\frac{\partial L }{\partial W}$,其中$L(z_1,z_2)$是损失函数,$\frac{\partial L }{\partial W}$计算式如下:
计算出上述结果之后,就可以利用随机梯度下降法进行更新:
我们来看$\frac{\partial L }{\partial W} $的每个分量$\frac{\partial L }{\partial w_{i,j}} $
注意$\frac{\partial L }{\partial z} =(\frac{\partial L }{\partial z_1}, \frac{\partial L }{\partial z_2})$,所以$\frac{\partial L }{\partial W} $可以写成如下形式:
如果现在如果有两个输入,可以表达为矩阵形式:
损失函数为
同之前计算过程可知:
我们再来计算$\frac{\partial L_b }{\partial X}$,注意
所以我们来计算$\frac{\partial L(z_{i,1},z_{i,2}) }{\partial X}$的每个分量$\frac{\partial L(z_{i,1},z_{i,2}) }{\partial x_{i,j}}$
从而
可以把上述计算过程写成如下接口:
other cases of matrix derivatives
再来看一些矩阵导数的例子:
现在的问题是如何计算$\frac{\partial C}{\partial A}$,这里老师给出如下定义:
这个量称为张量(tensor),计算式如下
假设
我们来计算$\frac{\partial L}{\partial A} $
这说明我们不需要通过计算$\frac{\partial C}{\partial A}$来计算$\frac{\partial L}{\partial A} $